/**
 * 测试PM2功能脚本
 * 验证PM2配置和进程管理功能
 */

require('dotenv').config();
const { exec } = require('child_process');
const path = require('path');

// 设置工作目录到项目根目录
const projectRoot = path.join(__dirname, '..');
process.chdir(projectRoot);

async function runCommand(command, description) {
  return new Promise((resolve) => {
    console.log(`\n🔧 ${description}`);
    console.log(`执行命令: ${command}`);
    
    exec(command, (error, stdout, stderr) => {
      if (error) {
        console.log(`❌ 命令执行失败: ${error.message}`);
        resolve(false);
        return;
      }
      
      if (stderr) {
        console.log(`⚠️  警告: ${stderr}`);
      }
      
      if (stdout) {
        console.log(`✅ 输出:\n${stdout}`);
      }
      
      resolve(true);
    });
  });
}

async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function testPM2() {
  console.log('📋 PM2功能测试脚本\n');
  
  try {
    // 1. 检查PM2是否安装
    console.log('1️⃣ 检查PM2安装状态');
    await runCommand('npx pm2 --version', '检查PM2版本');
    
    // 2. 检查配置文件
    console.log('\n2️⃣ 检查PM2配置文件');
    const fs = require('fs');
    const configPath = './ecosystem.config.js';
    
    if (fs.existsSync(configPath)) {
      console.log('✅ ecosystem.config.js 配置文件存在');
      
      // 验证配置文件语法
      try {
        const config = require(path.resolve(configPath));
        console.log('✅ 配置文件语法正确');
        console.log(`   应用名称: ${config.apps[0].name}`);
        console.log(`   启动脚本: ${config.apps[0].script}`);
      } catch (err) {
        console.log(`❌ 配置文件语法错误: ${err.message}`);
        return;
      }
    } else {
      console.log('❌ ecosystem.config.js 配置文件不存在');
      return;
    }
    
    // 3. 测试PM2命令
    console.log('\n3️⃣ 测试PM2命令');
    
    // 清理可能存在的进程
    await runCommand('npx pm2 delete multi-exchange-monitor 2>/dev/null || true', '清理旧进程');
    
    // 启动进程
    await runCommand('npm run pm2:start', '启动PM2进程');
    await sleep(3000); // 等待3秒
    
    // 查看状态
    await runCommand('npm run pm2:status', '查看进程状态');
    
    // 查看日志（最近几行）
    await runCommand('npx pm2 logs multi-exchange-monitor --lines 5', '查看最近日志');
    
    // 重启进程
    await runCommand('npm run pm2:restart', '重启进程');
    await sleep(2000);
    
    // 再次查看状态
    await runCommand('npm run pm2:status', '重启后状态');
    
    // 停止进程
    await runCommand('npm run pm2:stop', '停止进程');
    
    // 删除进程
    await runCommand('npm run pm2:delete', '删除进程');
    
    console.log('\n🎉 PM2功能测试完成！');
    console.log('\n💡 提示:');
    console.log('• 生产环境启动: npm run pm2:start');
    console.log('• 查看进程状态: npm run pm2:status');
    console.log('• 查看实时日志: npm run pm2:logs');
    console.log('• 监控面板: npm run pm2:monit');
    
  } catch (error) {
    console.log(`❌ 测试过程中出错: ${error.message}`);
  }
}

// 运行测试
testPM2().then(() => {
  console.log('\n👋 测试脚本执行完成');
}).catch(error => {
  console.log(`❌ 测试脚本执行失败: ${error.message}`);
});
